import { getAuthCodeSync } from '@/utils/login'
import { prePay, pay } from '@/api/yc_payment'
import {
  wxJsCode,
  tokenByCodeForAli
} from '@/api/login'
/*支付中心预支付方法 pre-pay
* @params {
*  platform, 平台 YC-云采 SC-数采 HC-慧采 FX-分销 FXS-分销商 MD-门店
*  orderId, 订单号
*  totalAmount, 应付总金额
*  customerCode, 客户代码
*  sendDepartmentId, 发货公司id
*  belongGroupId 销售归属公司
* }*/
export const prePayMethod = async(prePayParams) => {
  const lifeData = uni.getStorageSync('lifeData')
  const {
    mobilePhone: mobile,
  } = lifeData.vuex_accountInfo
  const params = {
    source: 'APPLET', // PC-PC端 APP-APP端 APPLET-小程序
    mobile,
    ...prePayParams
  }
  const res = await prePay(params)
  if (res.code != 0) {
    throw new Error(res.msg)
  }
  const prePayInfo = res.data
  return prePayInfo
}
/*调起微信支付*/
const requestPaymentFn = (payInfo, successCb, failCb) => {
  const lifeData = uni.getStorageSync('lifeData')
  const provider = lifeData.vuex_provider;
  const { prePayTn, paySerialnoId } = payInfo
  // #ifdef MP-WEIXIN
  const {
    timeStamp,
    nonceStr,
    signType,
    paySign,
  } = prePayTn
  // #endif
  uni.requestPayment({
    'provider': provider,
    // #ifdef MP-ALIPAY
    'orderInfo': prePayTn, //支付宝小程序参数
    // #endif
    // #ifdef MP-WEIXIN
    'timeStamp': timeStamp, //wx 时间戳
    'nonceStr': nonceStr, //wx 随机字符串
    'package': prePayTn.package, //wx 订单详情扩展字符串
    'signType': signType, //wx 签名方式，默认RSA
    'paySign': paySign, //wx 支付签名
    // #endif
    success(res) {
      // 支付宝支付成功跳转页面
      // #ifdef MP-ALIPAY
      if (res.resultCode == 9000) { //不加此判断，支付宝取消支付时就会跳到支付成功
        successCb({ ...res, paySerialnoId })
      } else {
        failCb({ ...res, paySerialnoId })
      }
      // #endif
      /*微信支付成功*/
      // #ifdef MP-WEIXIN
      successCb({ ...res, paySerialnoId })
      // #endif
    },
    fail(err) {
      failCb({ ...err, paySerialnoId })
    }
  })
}
/*支付中心支付方法 pay
* @params payInfo: {
*  platform, 平台
*  source, // PC-PC端 APP-APP端 APPLET-小程序
*  weChantOpenId, // 微信小程序OpenId 请求方可获取到OpenId时传递
*  aliPayUserId, //支付宝小程序用户ID(支付宝小程序支付时必填)
*  payWayUnifyCode 支付方式统一编码，用于不区分支付渠道，由服务端根据规则选择支付渠道 WechatPay=微信支付 AliPay=支付宝 EPay=网银支付 QuickPay=快捷 AccountPay=账期 PingAnPay=平安支付
*  payId, 支付单ID
*  payableAmount, 支付金额
*  payInfoTotalAmount, 支付单总金额
*  paySuccessRedirectUrl 自定义付款成功跳转页
*  ipAddress ip地址
*  versionCode app端版本号
*  paySerialnoId 支付流水号
* }*/
export const payMethod = async(payInfo, successCb = null, failCb = null) => {
  const lifeData = uni.getStorageSync('lifeData')
  const {
    vuex_provider
  } = lifeData
  const vuex_accountInfo = lifeData.vuex_accountInfo ? lifeData.vuex_accountInfo : {}
  const {
    payWayUnifyCode,
    source
  } = payInfo
  const {
    mobilePhone: mobile,
  } = vuex_accountInfo
  const authCode = await getAuthCodeSync(vuex_provider)
  const {
    code: wxCode
  } = authCode
  let accountInfoParams = {
    code: wxCode,
  }
  if(source =="APP"){
    accountInfoParams.source=source
  }
  // #ifdef MP-WEIXIN
  const weixinAccountInfoRes = await wxJsCode(accountInfoParams)
  if (weixinAccountInfoRes.errorCode != 0 && weixinAccountInfoRes.errorCode != 2) {
    uni.$u.toast(weixinAccountInfoRes.msg)
    return
  }
  const weChantOpenId = weixinAccountInfoRes.data.openid
  // #endif
  // #ifdef MP-ALIPAY
  const aliPayAccountInfoRes = await tokenByCodeForAli(accountInfoParams)
  if (aliPayAccountInfoRes.errorCode != 0 && aliPayAccountInfoRes.errorCode != 2) {
    uni.$u.toast(aliPayAccountInfoRes.msg)
    return
  }
  const aliPayUserId = aliPayAccountInfoRes.data.userId
  // #endif
  const params = {
    ...payInfo,
    source: source || 'APPLET',
    mobile,
    // #ifdef MP-WEIXIN
    weChantOpenId, // 微信小程序OpenId 请求方可获取到OpenId时传递
    wxCode, //微信小程序code(微信小程序支付必填)
    // #endif
    // #ifdef MP-ALIPAY
    aliPayUserId, //支付宝小程序用户ID(支付宝小程序支付时必填)
    // #endif
  }
  const res = await pay(params)
  if (res.code != 0) {
    if (payWayUnifyCode == 'AccountPay') { // 账期支付失败
      failCb(res)
      return
    }
    uni.$u.toast(res.msg) // 在线支付失败
    return
  }
  if (payWayUnifyCode == 'AccountPay') { // 账期支付成功
    successCb(res)
    return
  }
  if (payWayUnifyCode == 'WechatPay' || payWayUnifyCode == 'AliPay') { //微信支付、支付宝支付
    requestPaymentFn(res.data, successCb, failCb)
  }
}
